import asyncio
import json

import streamlit as st

from api_client import main as send_request
from models import Database


def main():
    st.title("问卷数据管理系统")

    # 初始化数据库连接
    db = Database()

    # 创建侧边栏
    st.sidebar.title("功能选择")
    option = st.sidebar.radio("选择操作", ["添加数据", "查看数据", "对话分析"])

    if option == "添加数据":
        st.header("添加新问卷数据")

        # 创建JSON输入区域
        json_input = st.text_area("请输入JSON数据", height=300)

        if st.button("提交"):
            try:
                # 解析JSON数据
                data = eval(json_input)

                # 验证必要字段
                required_fields = [
                    "userId", "dialogId", "messageId", "message",
                    "userTagAnalysis", "topElements", "questions", "history"
                ]
                missing_fields = [
                    field for field in required_fields if field not in data
                ]

                if missing_fields:
                    st.error(f"缺少必要字段: {', '.join(missing_fields)}")
                else:
                    # 插入数据
                    if db.insert_questionnaire(data):
                        st.success("数据添加成功！")
                    else:
                        st.error("数据添加失败！")
            except json.JSONDecodeError:
                st.error("JSON格式无效！")
            except Exception as e:
                st.error(f"发生错误：{str(e)}")

    elif option == "对话分析":
        st.header("对话分析")

        # 从数据库获取所有对话ID
        questionnaires = db.get_all_questionnaires()
        dialog_ids = list(set(q['dialog_id'] for q in questionnaires))

        # 创建下拉选择框
        selected_dialog_id = st.selectbox("请选择对话ID",
                                          dialog_ids,
                                          format_func=lambda x: f"对话ID: {x}")

        if selected_dialog_id:
            # 获取选中的对话数据
            selected_data = next((q for q in questionnaires
                                  if q['dialog_id'] == selected_dialog_id),
                                 None)

            if selected_data:
                # 显示当前选中的对话数据
                with st.expander("当前对话数据", expanded=True):
                    # 显示当前选中的对话数据基本信息
                    st.write(f"""
                    - **ID**: {selected_data['id']}
                    - **对话ID**: {selected_data['dialog_id']}
                    - **用户ID**: {selected_data['user_id']}
                    - **用户回复**: {selected_data['message']}
                    """)

                # 显示详细信息
                with st.expander("详细信息", expanded=False):
                    # 创建一个不包含基本信息的副本用于显示详细信息
                    detailed_data = selected_data.copy()
                    detailed_data.pop('id', None)
                    detailed_data.pop('dialog_id', None)
                    detailed_data.pop('user_id', None)
                    detailed_data.pop('message', None)
                    st.json(detailed_data)

                # 添加发送请求的按钮
                if st.button("发送分析请求"):
                    try:
                        # 显示旧模型结果
                        st.write("#### 旧模型结果")
                        st.markdown(selected_data["history"][-1]["content"])
                        # 发送异步请求并等待结果
                        selected_data['message'] = selected_data['history'][
                            -2]['content']
                        selected_data['history'] = selected_data[
                            'history'][:-2]
                        selected_data.pop('id')
                        print(selected_data['history'])
                        print(selected_data['message'])
                        response_chunks = asyncio.run(
                            send_request(selected_data))

                        # 显示分析结果
                        st.write("#### 新模型结果：")

                        # 创建占位符用于显示流式响应
                        response_placeholder = st.empty()
                        message_container = ""

                        # 处理流式响应
                        first_chunk = True
                        for chunk, response_time in response_chunks:
                            if first_chunk:
                                st.success(
                                    f"分析请求成功！响应时间: {response_time:.2f}秒")
                                first_chunk = False

                            try:
                                cur_message = eval(chunk.replace(
                                    "data:", ""))['message']
                                message_container = cur_message
                                response_placeholder.markdown(
                                    message_container)
                            except Exception as e:
                                continue
                            # if data.get('stop') == 'end':
                            #     break

                    except Exception as e:
                        st.error(f"发送请求时发生错误：{str(e)}")
            else:
                st.warning("未找到相关对话数据")

    else:  # 查看数据
        st.header("问卷数据列表")

        # 获取所有数据
        questionnaires = db.get_all_questionnaires()

        # 显示数据
        for idx, questionnaire in enumerate(questionnaires, 1):
            with st.expander(f"问卷 #{idx} - 用户ID: {questionnaire['user_id']}"):
                st.json(questionnaire)
                # 添加删除按钮
                if st.button(f"删除问卷 #{idx}",
                             key=f"delete_{questionnaire['id']}"):
                    if db.delete_questionnaire(questionnaire['id']):
                        st.success("删除成功！")
                        # 刷新页面以更新数据
                        # st.rerun()

                    else:
                        st.error("删除失败！")

    # 关闭数据库连接
    db.close()


if __name__ == "__main__":
    main()
